#ifndef PROTOCOLYMODEM_H
#define PROTOCOLYMODEM_H


#include <QSerialPort>
#include <QFile>

#include <qdebug.h>

#include "protocol.h"
#include "../ymodem/ymodem.h"

class ProtocolYModem : public Protocol, public YModem
{
public:
    ProtocolYModem(QSerialPort *serial);
    ~ProtocolYModem();
    
    void begin(Direction dir, QString &_path) override;
    void run(Direction dir) override;
    bool over() override;

    void setSendPath(const QString &_path);
    void setReadPath(const QString &_path);

protected:
     uint32_t write(uint8_t *data, uint32_t len) override;
     uint32_t read(uint8_t *data, uint32_t len) override;

     int fileOpen(FileOperateType type) override;
     int fileClose() override;
     uint32_t fileWrite(uint8_t *data, uint32_t size) override;
     uint32_t fileRead(uint8_t *data, uint32_t size) override;

 private:
     QSerialPort *m_serial = nullptr;

     QFile *file;
     QString path;
};

#endif // PROTOCOLYMODEM_H




//uint32_t ProtocolYModem::fileOperation(OperationType type, uint8_t *data, uint32_t len)
//{
//     switch(type){
//     case FileOpenReadOnly:
//         if(!file->open(QIODevice::ReadOnly)){
//             return 0;
//         }
//         return 1;

//     case FileOpenWriteOnly:
//         if(!file->open(QIODevice::WriteOnly)){
//             return 0;
//         }
//         return 1;

//     case FileOpenReadWrite:
//         if(!file->open(QIODevice::ReadWrite)){
//             return 0;
//         }
//         return 1;

//     case FileClose:
//         file->close();
//         return 1;

//     case FileGetName:{
//         QFileInfo info(*file);
//         memcpy((char *)data, info.fileName().toUtf8().data(), info.fileName().size());
//         return info.fileName().size();
//     }

//     case FileSetName:{
//         QString fileName = QDir(path).filePath(QString((char *)data));
//         file->setFileName(fileName);
//         return 1;
//     }

//     case FileGetSize:{
//         QFileInfo info(*file);
//         memcpy((char *)data, QByteArray::number(info.size()).data(), QByteArray::number(info.size()).size());
//         return info.size();
//     }

//     case FileWrite:
//         return file->write((char *)data, len);

//     case FileRead:
//         return file->read((char *)data, len);

//     default:
//         break;
//     }

//     return 0;
//}
